/*
 * TacticaFCRN.java
 *
 * Created on 20 de marzo de 2007, 11:15 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.R_NAJERA;
import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;

/**
 *
 * @author Administrador
 */
public class TacticaFCRN implements Tactica{
    
    private int nValores[][]={
        {-150,0,7},  // Jugador 1[0] Portero
        {-100,-65,6},  // Jugador 2[1] Defensa 1
        {-100,65,6},  // Jugador 3[2] Defensa 2
        {-105,20,7},  // Jugador 4[3] Defenza 3
        {-105,-20,7},  // Jugador 5[4] Defensa 4
        {0,50,7},  // Jugador 6[5] Contencion 2
        {65,-85,6},  // Jugador 7[6] Carrilero 1
        {0,-50,6},  // Jugador 8[7] Contencion 1
        {65,85,6},  // Jugador 9[8] Carrilero 2
        {70,0,7},  // Jugador 10[9] Delantero 1
        {90,15,7}  // Jugador 11[10] Delantero 2
    };

    public String getNombre(){
        return "FC R-Njera";
    }
    
    public Color getColor1(){
        return new Color(20,3,228);
    }
    
    public Color getColor2(){
        return new Color(163,68,183);
    }
    
    public Color getColorNumero(){
        return Color.YELLOW;
    }
    
    public int getFuerza(int n){
        return nValores[n][2];
    }
    public int getXInicial(int n){
        return nValores[n][0];
    }
    
    public int getYInicial(int n){
        return nValores[n][1];
    }
    
    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        
        //Mejorar defensa
        if (!sj.estoyMasCercaDeBola() || bola.getX()<-70 && bola.getX()>-100){
            for (int n=1;n<3;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
            }
        }
        else if (!sj.estoyMasCercaDeBola() || bola.getX()<-101){
            for (int n=1;n<3;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()-10, contrarios[nJC].getY()-5));
            }
        }
        
        //Mejorar defensa
        if (!sj.estoyMasCercaDeBola() || bola.getX()<-90 && bola.getX()>-100 ){
            for (int n=3;n<5;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+5, contrarios[nJC].getY()));
            }
        }
        else if (!sj.estoyMasCercaDeBola() || bola.getX()<-101){
            for (int n=3;n<5;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()-15, contrarios[nJC].getY()-10));
            }
        }
        
           
        //Movimiento portero
        if (bola.getX()<-20){
            int y=(int)(bola.getY()/2);
            if (y<-30) y=-30;
            if (y>30) y=30;
            com.add(new ComandoIrA(0, nValores[0][0], y));
        }
        
               
         //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
        //Point bola=sj.getBola();
        com.add(new ComandoIrA(nJug, bola.getX() , bola.getY()));
        
       if (bola.getY()>0){
            com.add(new ComandoPase(0,8));
       }
       else
            com.add(new ComandoPase(0,6));
        
       com.add(new ComandoPase(3,8));
        
       com.add(new ComandoPase(4,6));
                
       com.add(new ComandoPase(5,10));
               
       com.add(new ComandoPase(7,9));
                
       com.add(new ComandoPase(6,9));
                        
       com.add(new ComandoPase(8,10));
                  
        
       for (int n=6;n<11;n++)
           com.add(new ComandoTiroAPuerta(n,0));
        
       lanzarBolaMejor(sj, com);
        
       return com;
    }
    
  private int heuristica(SituacionJugadores sj, int x, int y){
        int nHeu=y*5-x*100;
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
            if (nDis<70)
                nHeu-=1000;
        }
        
        Point contrarios[]=sj.getContrario();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
            if (nDis<70)
                nHeu+=1000;
        }
        return nHeu;
    }
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int nHeuMejor=9999999;
        int xMej=0, yMej=0;
        int x=0, y=0, nHeu;
        for (int n=0;n<50;n++){
            x=(int)(Math.random()*340)-170;
            y=(int)(Math.random()*240)-120;
            nHeu=heuristica(sj,x,y);
            if (nHeuMejor>nHeu){
                nHeuMejor=nHeu;
                xMej=x;
                yMej=y;
            }
        }
        
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            if (jugadores[n].getX()>60)
                com.add(new ComandoTiroAPuerta(n,5));
            else
                com.add(new ComandoGolpearBola(n,xMej, yMej));
                
        }
    }
    
}

